// 进行普通文件的复制

// 导入输入流相关类，用于读取文件内容
import java.io.*;
// 导入 Scanner 类，用于从控制台读取用户输入
import java.util.*;

/**
 * 该类用于实现普通文件的复制功能
 */
public class Demo2 {
    /**
     * 程序的入口方法，负责处理用户输入并执行文件复制操作
     * @param args 命令行参数，在本程序中未使用
     * @throws IOException 处理文件输入输出时可能抛出的异常
     */
    public static void main(String[] args) throws IOException {
        // 创建一个 Scanner 对象，用于从控制台读取用户输入
        Scanner scanner = new Scanner(System.in); 

        // 提示用户输入要复制的文件路径
        System.out.println("请输入要复制的文件（绝对路径 OR 相对路径): ");
        // 读取用户输入的源文件路径
        //D:\文件测试\测试1\441.docx
        String sourcePath = scanner.next();
        // 根据用户输入的路径创建一个 File 对象
        File sourceFile = new File(sourcePath);
        // 检查源文件是否存在
        if (!sourceFile.exists()) {
            // 如果文件不存在，输出提示信息并终止程序
            System.out.println("文件不存在，请确认路径是否正确");
            return;
        }

        // 检查源文件是否为普通文件
        if (!sourceFile.isFile()) {
            // 如果不是普通文件，输出提示信息并终止程序
            System.out.println("文件不是普通文件，请确认路径是否正确");
            return;
        }

        // 提示用户输入目标文件路径
        System.out.println("请输入要复制到的目标路径（绝对路径 OR 相对路径): ");
        // 读取用户输入的目标文件路径
        //D:\文件测试\测试2\441.docx
        String destPath = scanner.next();
        // 根据用户输入的路径创建一个 File 对象
        File destFile = new File(destPath);
        // 检查目标文件是否已经存在
        if (destFile.exists()) {
            // 检查目标路径是否为目录
            if (destFile.isDirectory()) {
                // 如果是目录，输出提示信息并终止程序
                System.out.println("目标路径已经存在，并且是一个目录，请确认路径是否正确");
                return;
            }

            // 检查目标路径是否为普通文件
            if (destFile.isFile()) {
                // 如果是普通文件，询问用户是否要覆盖
                System.out.println("目标文件已经存在，是否要进行覆盖？y/n");
                // 读取用户的选择
                String ans = scanner.next();
                // 检查用户是否选择不覆盖
                if (!ans.toLowerCase().equals("y")) {
                    // 如果不覆盖，输出提示信息并终止程序
                    System.out.println("停止复制");
                    return;
                }
            }
        }

        // 使用 try-with-resources 语句创建输入流，确保资源自动关闭
        try (InputStream is = new FileInputStream(sourceFile)) {
            // 使用 try-with-resources 语句创建输出流，确保资源自动关闭
            try (OutputStream os = new FileOutputStream(destFile)) {
                // 创建一个字节数组缓冲区，用于存储从输入流读取的数据
                byte[] buf = new byte[1024];
                // 用于存储每次读取的字节数
                int len;

                // 循环读取输入流的数据，直到文件末尾
                while ((len = is.read(buf)) != -1) {
                    // 将读取的数据写入输出流
                    os.write(buf, 0, len);
                }

                // 刷新输出流，确保所有数据都被写入文件
                os.flush();
            }
        }
        // 输出文件复制完成的提示信息
        System.out.println("复制已完成");
    }
}